/*************************************************************************
    > File Name: ts_crpyt.c
    > Author: JiaZiChunQiu
    > Created Time: 2024年08月03日 星期六 22时56分59秒
    > Mail: JiaZiChunQiu@163.com
    > Title: 测试crypt的使用，以及获取Linux下的用户名和密码
    > Content:
 ************************************************************************/

#include <my_header.h>
#include <unistd.h>
#include <shadow.h>

void help(void) {
    printf("用户密码验证程序\n第一个参数为用户名\n");
    exit(-1);
}

void error_quit(char* msg) {
    perror(msg);
    exit(-2);
}

void get_salt(char* setting, char* pwd){
    int i, j;
    for( i = 0, j = 0; pwd[i] && j != 4; ++i ) {
        if (pwd[i] == '$') ++j;
    }
    strncpy(setting, pwd, i - 1);
}

int main (int argc, char* argv[]) {
    struct spwd* sp;
    char* pwd;
    char setting[512] = { 0 };
    if ( argc != 2 ) help();
    
    pwd = getpass("请输入密码"); // 获取用户输入密码
    if ( (sp = getspnam(argv[1])) == NULL ) { error_quit("获取用户名和密码"); }
    
    get_salt(setting, sp->sp_pwdp); // 从Linux中存储密码的结构中获取到salt

    if ( strcmp(sp->sp_pwdp, crypt(pwd, setting)) == 0) printf("验证通过!\n");
    else printf("验证失败\n");

    return 0;
}
